<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Radar Search - ClientRadar</title>
    
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            background: #f5f7fa;
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
        }
        
        .header {
            background: white;
            padding: 24px 32px;
            border-radius: 12px;
            margin-bottom: 24px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.04);
            display: flex;
            justify-content: space-between;
            align-items: center;
            border: 1px solid #e5e7eb;
        }
        
        .header h1 {
            font-size: 26px;
            color: #1f2937;
            display: flex;
            align-items: center;
            gap: 12px;
            font-weight: 600;
        }
        
        .header .back-btn {
            background: #6366f1;
            color: white;
            padding: 10px 20px;
            border-radius: 8px;
            text-decoration: none;
            font-size: 14px;
            font-weight: 500;
            transition: all 0.2s;
            border: none;
        }
        
        .header .back-btn:hover {
            background: #4f46e5;
            transform: translateY(-1px);
            box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
        }
        
        .mode-selector {
            background: white;
            padding: 32px;
            border-radius: 12px;
            margin-bottom: 24px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.04);
            border: 1px solid #e5e7eb;
        }
        
        .mode-selector h2 {
            text-align: center;
            color: #1f2937;
            margin-bottom: 28px;
            font-size: 20px;
            font-weight: 600;
        }
        
        .mode-cards {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 20px;
            max-width: 900px;
            margin: 0 auto;
        }
        
        .mode-card {
            background: white;
            padding: 28px;
            border-radius: 12px;
            cursor: pointer;
            transition: all 0.2s;
            color: #1f2937;
            text-align: center;
            border: 2px solid #e5e7eb;
            position: relative;
            overflow: hidden;
        }
        
        .mode-card::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            height: 4px;
            background: linear-gradient(90deg, #6366f1 0%, #8b5cf6 100%);
            opacity: 0;
            transition: opacity 0.2s;
        }
        
        .mode-card:hover {
            transform: translateY(-2px);
            box-shadow: 0 8px 24px rgba(0,0,0,0.08);
            border-color: #6366f1;
        }
        
        .mode-card:hover::before {
            opacity: 1;
        }
        
        .mode-card.active {
            border-color: #6366f1;
            background: #f5f7ff;
            box-shadow: 0 8px 24px rgba(99, 102, 241, 0.15);
        }
        
        .mode-card.active::before {
            opacity: 1;
        }
        
        .mode-card.employment::before {
            background: linear-gradient(90deg, #06b6d4 0%, #3b82f6 100%);
        }
        
        .mode-card.employment:hover {
            border-color: #06b6d4;
        }
        
        .mode-card.employment.active {
            border-color: #06b6d4;
            background: #f0f9ff;
        }
        
        .mode-card h3 {
            font-size: 20px;
            margin-bottom: 16px;
            font-weight: 600;
            color: #1f2937;
        }
        
        .mode-card ul {
            list-style: none;
            text-align: left;
            margin: 0;
            display: flex;
            flex-direction: column;
            gap: 8px;
        }
        
        .mode-card ul li {
            padding: 0;
            font-size: 14px;
            color: #6b7280;
            display: flex;
            align-items: center;
            gap: 8px;
        }
        
        .mode-card ul li:before {
            content: "✓";
            color: #10b981;
            font-weight: bold;
            font-size: 16px;
        }
        
        .filters-panel {
            background: white;
            padding: 32px;
            border-radius: 12px;
            margin-bottom: 24px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.04);
            border: 1px solid #e5e7eb;
            display: none;
        }
        
        .filters-panel.active {
            display: block;
            animation: slideDown 0.3s ease;
        }
        
        @keyframes slideDown {
            from { opacity: 0; transform: translateY(-20px); }
            to   { opacity: 1; transform: translateY(0); }
        }
        
        .filter-section {
            margin-bottom: 25px;
        }
        
        .filter-section h3 {
            color: #1f2937;
            margin-bottom: 16px;
            font-size: 16px;
            font-weight: 600;
            display: flex;
            align-items: center;
            gap: 8px;
        }
        
        .checkbox-group {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
            gap: 10px;
        }
        
        .checkbox-group label {
            display: flex;
            align-items: center;
            gap: 10px;
            padding: 12px;
            background: #f9fafb;
            border-radius: 8px;
            cursor: pointer;
            transition: all 0.2s;
            border: 1px solid #e5e7eb;
            font-size: 14px;
            color: #374151;
        }
        
        .checkbox-group label:hover {
            background: white;
            border-color: #6366f1;
        }
        
        .checkbox-group input[type="checkbox"] {
            width: 18px;
            height: 18px;
            cursor: pointer;
            accent-color: #6366f1;
        }
        
        .radio-group {
            display: flex;
            gap: 12px;
            flex-wrap: wrap;
        }
        
        .radio-group label {
            display: flex;
            align-items: center;
            gap: 8px;
            padding: 10px 18px;
            background: #f9fafb;
            border-radius: 20px;
            cursor: pointer;
            transition: all 0.2s;
            border: 1px solid #e5e7eb;
            font-size: 14px;
            color: #374151;
        }
        
        .radio-group label:hover {
            background: white;
            border-color: #6366f1;
        }
        
        .radio-group input[type="radio"] {
            width: 16px;
            height: 16px;
            cursor: pointer;
            accent-color: #6366f1;
        }
        
        .search-input {
            width: 100%;
            padding: 12px 16px;
            border: 1px solid #e5e7eb;
            border-radius: 8px;
            font-size: 14px;
            transition: all 0.2s;
            background: #f9fafb;
        }
        
        .search-input:focus {
            outline: none;
            border-color: #6366f1;
            box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
            background: white;
        }
        
        .action-buttons {
            display: flex;
            gap: 15px;
            margin-top: 30px;
        }
        
        .btn {
            padding: 11px 24px;
            border: none;
            border-radius: 8px;
            font-size: 14px;
            cursor: pointer;
            transition: all 0.2s;
            font-weight: 500;
        }
        
        .btn-primary {
            background: #6366f1;
            color: white;
        }
        
        .btn-primary:hover {
            background: #4f46e5;
            transform: translateY(-1px);
            box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
        }
        
        .btn-secondary {
            background: #6b7280;
            color: white;
        }
        
        .btn-secondary:hover {
            background: #4b5563;
        }
        
        .btn-save {
            background: #10b981;
            color: white;
        }
        
        .btn-save:hover {
            background: #059669;
        }
        
        .results-panel {
            background: white;
            padding: 32px;
            border-radius: 12px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.04);
            border: 1px solid #e5e7eb;
            display: none;
        }
        
        .results-panel.active {
            display: block;
            animation: slideDown 0.3s ease;
        }
        
        .results-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 24px;
            padding-bottom: 16px;
            border-bottom: 2px solid #f3f4f6;
        }
        
        .results-header h2 {
            color: #1f2937;
            font-size: 20px;
            font-weight: 600;
        }
        
        .results-count {
            background: #6366f1;
            color: white;
            padding: 8px 16px;
            border-radius: 20px;
            font-weight: 500;
            font-size: 14px;
        }
        
        .project-card {
            background: #f9fafb;
            padding: 20px;
            border-radius: 10px;
            margin-bottom: 16px;
            border-left: 3px solid #6366f1;
            transition: all 0.2s;
            border: 1px solid #e5e7eb;
        }
        
        .project-card:hover {
            transform: translateX(4px);
            box-shadow: 0 4px 12px rgba(0,0,0,0.06);
            border-left-color: #4f46e5;
            background: white;
        }
        
        .project-title {
            font-size: 18px;
            color: #333;
            margin-bottom: 10px;
            font-weight: 600;
        }
        
        .project-meta {
            display: flex;
            gap: 20px;
            margin-bottom: 10px;
            flex-wrap: wrap;
        }
        
        .project-meta span {
            font-size: 14px;
            color: #666;
            display: flex;
            align-items: center;
            gap: 5px;
        }
        
        .project-description {
            color: #555;
            font-size: 14px;
            line-height: 1.6;
            margin-bottom: 15px;
        }
        
        .project-actions {
            display: flex;
            gap: 10px;
        }
        
        .btn-view {
            background: #6366f1;
            color: white;
            padding: 10px 20px;
            border-radius: 8px;
            font-size: 14px;
            font-weight: 500;
            border: none;
            cursor: pointer;
            transition: all 0.2s;
            text-decoration: none;
            display: inline-block;
        }
        
        .btn-view:hover {
            background: #4f46e5;
            transform: translateY(-1px);
            box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
        }
        
        .btn-proposal {
            background: #10b981;
            color: white;
            padding: 10px 20px;
            border-radius: 8px;
            font-size: 14px;
            font-weight: 500;
            border: none;
            cursor: pointer;
            transition: all 0.2s;
            text-decoration: none;
        }
        
        .btn-proposal:hover {
            background: #059669;
            transform: translateY(-1px);
            box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
        }

        /* ── Locked / Upgrade Banner ───────────────────────── */
        .locked-banner {
            text-align: center;
            padding: 60px 20px;
            background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
            border-radius: 12px;
            border: 2px solid #f59e0b;
        }

        .locked-banner .lock-icon {
            font-size: 64px;
            margin-bottom: 16px;
        }

        .locked-banner h3 {
            font-size: 24px;
            color: #92400e;
            margin-bottom: 12px;
            font-weight: 700;
        }

        .locked-banner p {
            color: #78350f;
            font-size: 16px;
            margin-bottom: 24px;
            line-height: 1.6;
        }

        .locked-banner .btn-upgrade {
            background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
            color: white;
            padding: 14px 32px;
            border-radius: 10px;
            font-size: 16px;
            font-weight: 600;
            text-decoration: none;
            display: inline-block;
            transition: all 0.2s;
            border: none;
            cursor: pointer;
        }

        .locked-banner .btn-upgrade:hover {
            transform: translateY(-2px);
            box-shadow: 0 8px 20px rgba(245, 158, 11, 0.4);
        }

        /* ── Error Banner ──────────────────────────────────── */
        .error-banner {
            text-align: center;
            padding: 40px 20px;
            background: #fef2f2;
            border-radius: 12px;
            border: 2px solid #fecaca;
        }

        .error-banner h3 {
            font-size: 20px;
            color: #991b1b;
            margin-bottom: 10px;
        }

        .error-banner p {
            color: #7f1d1d;
            font-size: 14px;
            margin-bottom: 20px;
        }

        .error-banner .btn-retry {
            background: #ef4444;
            color: white;
            padding: 10px 24px;
            border-radius: 8px;
            font-size: 14px;
            font-weight: 600;
            border: none;
            cursor: pointer;
            transition: all 0.2s;
        }

        .error-banner .btn-retry:hover {
            background: #dc2626;
        }
        /* ─────────────────────────────────────────────────── */
        
        .loading {
            text-align: center;
            padding: 40px;
            font-size: 18px;
            color: #666;
        }
        
        .spinner {
            border: 4px solid #f3f4f6;
            border-top: 4px solid #6366f1;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            animation: spin 1s linear infinite;
            margin: 0 auto 20px;
        }
        
        @keyframes spin {
            0%   { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        
        .no-results {
            text-align: center;
            padding: 60px 20px;
            color: #666;
        }
        
        .no-results h3 {
            font-size: 24px;
            margin-bottom: 15px;
        }
        
        /* Modal */
        .modal {
            display: none;
            position: fixed;
            top: 0; left: 0;
            width: 100%; height: 100%;
            background: rgba(0,0,0,0.7);
            z-index: 1000;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }
        
        .modal.active {
            display: flex;
        }
        
        .modal-content {
            background: white;
            border-radius: 16px;
            padding: 30px;
            max-width: 700px;
            width: 100%;
            max-height: 90vh;
            overflow-y: auto;
        }
        
        .modal-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
            padding-bottom: 15px;
            border-bottom: 2px solid #e5e7eb;
        }
        
        .modal-header h2 {
            margin: 0;
            font-size: 24px;
            color: #1f2937;
        }
        
        .modal-close {
            background: none;
            border: none;
            font-size: 28px;
            cursor: pointer;
            color: #64748b;
            line-height: 1;
            padding: 0;
            width: 32px;
            height: 32px;
        }
        
        .modal-close:hover { color: #1f2937; }
        
        .proposal-text {
            background: #f9fafb;
            border: 2px solid #e5e7eb;
            border-radius: 12px;
            padding: 20px;
            font-size: 15px;
            line-height: 1.8;
            color: #1e293b;
            white-space: pre-wrap;
            margin-bottom: 20px;
        }
        
        .copy-btn-modal {
            background: #6366f1;
            color: white;
            padding: 12px 24px;
            border-radius: 8px;
            border: none;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
            margin-right: 10px;
        }
        
        .copy-btn-modal:hover    { background: #4f46e5; }
        .copy-btn-modal.copied   { background: #10b981; }
        
        .regenerate-btn-modal {
            background: #f59e0b;
            color: white;
            padding: 12px 24px;
            border-radius: 8px;
            border: none;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .regenerate-btn-modal:hover { background: #d97706; }
        
        .modal-error-message {
            background: #fef2f2;
            border: 2px solid #fecaca;
            border-radius: 8px;
            padding: 15px;
            color: #991b1b;
            margin-bottom: 15px;
        }
        
        @media (max-width: 768px) {
            .mode-cards       { grid-template-columns: 1fr; }
            .checkbox-group   { grid-template-columns: 1fr; }
            .action-buttons   { flex-direction: column; }
        }
    </style>
</head>
<body>
    <div class="container">

        <!-- Header -->
        <div class="header">
            <h1>🔍 Radar Search</h1>
            <a href="projects_table.php" class="back-btn">← Back to Projects</a>
        </div>
        
        <!-- Mode Selector -->
        <div class="mode-selector">
            <h2>📌 What type of project are you looking for?</h2>
            <div class="mode-cards">
                <div class="mode-card active" data-mode="freelance">
                    <h3>🎯 Freelance Projects</h3>
                    <ul>
                        <li>Independent work</li>
                        <li>Clear deliverables</li>
                        <li>Fixed-price</li>
                        <li>Solo execution</li>
                    </ul>
                </div>
                <div class="mode-card employment" data-mode="employment">
                    <h3>💼 Employment Opportunities</h3>
                    <ul>
                        <li>Full/Part-time jobs</li>
                        <li>Team/Management roles</li>
                        <li>Long-term contracts</li>
                        <li>Salary positions</li>
                    </ul>
                </div>
            </div>
        </div>
        
        <!-- Filters Panel -->
        <div class="filters-panel" id="filtersPanel">
            <div class="filter-section">
                <h3>📂 Categories (Multiple selection)</h3>
                <div class="checkbox-group">
                    <label><input type="checkbox" name="category" value="Web Development"> Web Development</label>
                    <label><input type="checkbox" name="category" value="Automation"> Automation</label>
                    <label><input type="checkbox" name="category" value="Script"> Scripts &amp; Bots</label>
                    <label><input type="checkbox" name="category" value="API"> API Integration</label>
                    <label><input type="checkbox" name="category" value="Data"> Data Tasks</label>
                    <label><input type="checkbox" name="category" value="Fix"> Quick Fixes</label>
                    <label><input type="checkbox" name="category" value="MVP"> MVP/Feature Build</label>
                    <label><input type="checkbox" name="category" value="Mobile"> Mobile Dev</label>
                </div>
            </div>
            
            <div class="filter-section">
                <h3>💰 Budget Range</h3>
                <div class="radio-group">
                    <label><input type="radio" name="budget" value="all" checked> All</label>
                    <label><input type="radio" name="budget" value="100-500"> $100-500</label>
                    <label><input type="radio" name="budget" value="500-1000"> $500-1K</label>
                    <label><input type="radio" name="budget" value="1000-5000"> $1K-5K</label>
                    <label><input type="radio" name="budget" value="5000-999999"> $5K+</label>
                </div>
            </div>
            
            <div class="filter-section">
                <h3>📅 Recency</h3>
                <div class="radio-group">
                    <label><input type="radio" name="recency" value="today"> Today</label>
                    <label><input type="radio" name="recency" value="week" checked> This Week</label>
                    <label><input type="radio" name="recency" value="month"> This Month</label>
                    <label><input type="radio" name="recency" value="all"> All Time</label>
                </div>
            </div>
            
            <div class="filter-section">
                <h3>🌐 Source Platforms</h3>
                <div class="checkbox-group">
                    <label><input type="checkbox" name="source" value="Guru" checked> Guru</label>
                    <label><input type="checkbox" name="source" value="Upwork"> Upwork</label>
                    <label><input type="checkbox" name="source" value="Freelancer"> Freelancer</label>
                    <label><input type="checkbox" name="source" value="RemoteOK"> RemoteOK</label>
                    <label><input type="checkbox" name="source" value="We Work Remotely"> We Work Remotely</label>
                    <label><input type="checkbox" name="source" value="Jobicy"> Jobicy</label>
                </div>
            </div>
            
            <div class="filter-section">
                <h3>🔍 Advanced Search (Optional)</h3>
                <input type="text" class="search-input" id="keywords" placeholder="Keywords... (e.g., php api wordpress)">
            </div>
            
            <div class="action-buttons">
                <button class="btn btn-primary" onclick="applyFilters()">🎯 Apply Filters</button>
                <button class="btn btn-save"    onclick="saveAsDefault()">💾 Save as Default</button>
                <button class="btn btn-secondary" onclick="resetFilters()">🔄 Reset</button>
            </div>
        </div>
        
        <!-- Results Panel -->
        <div class="results-panel" id="resultsPanel">
            <div class="results-header">
                <h2>📊 Search Results</h2>
                <div class="results-count" id="resultsCount">0 projects</div>
            </div>
            <div id="projectsList"></div>
        </div>

    </div>
    
    <!-- Proposal Modal -->
    <div id="proposalModal" class="modal">
        <div class="modal-content">
            <div class="modal-header">
                <h2>✨ AI Generated Proposal</h2>
                <button class="modal-close" onclick="closeModal()">×</button>
            </div>
            <div id="modalBody"></div>
        </div>
    </div>
    
    <script>
        let currentMode    = 'freelance';
        let isLoading      = false;

        // ── Mode Selection ───────────────────────────────────────────
        document.querySelectorAll('.mode-card').forEach(card => {
            card.addEventListener('click', function() {
                document.querySelectorAll('.mode-card').forEach(c => c.classList.remove('active'));
                this.classList.add('active');
                currentMode = this.dataset.mode;
                document.getElementById('filtersPanel').classList.add('active');
                setTimeout(() => applyFilters(), 300);
            });
        });

        // ── Apply Filters ────────────────────────────────────────────
        function applyFilters() {
            if (isLoading) return;

            const categories = Array.from(document.querySelectorAll('input[name="category"]:checked')).map(cb => cb.value);
            const budget     = document.querySelector('input[name="budget"]:checked').value;
            const recency    = document.querySelector('input[name="recency"]:checked').value;
            const sources    = Array.from(document.querySelectorAll('input[name="source"]:checked')).map(cb => cb.value);
            const keywords   = document.getElementById('keywords').value.trim();

            let budget_min = 0, budget_max = 999999;
            if (budget !== 'all') {
                const parts = budget.split('-');
                budget_min  = parseInt(parts[0]);
                budget_max  = parseInt(parts[1]);
            }

            const params = new URLSearchParams({
                mode:       currentMode,
                categories: categories.join(','),
                budget_min,
                budget_max,
                sources:    sources.join(','),
                recency,
                keywords
            });

            // Show loading
            isLoading = true;
            const resultsPanel = document.getElementById('resultsPanel');
            const projectsList = document.getElementById('projectsList');
            resultsPanel.classList.add('active');
            projectsList.innerHTML = `
                <div class="loading">
                    <div class="spinner"></div>
                    <p>⏳ Searching...</p>
                </div>`;

            fetch(`radar_search_api_v2.php?${params}`)
                .then(response => {
                    // اگر سرور ارور HTTP داد (500، 404، ...)
                    if (!response.ok) {
                        throw new Error(`Server error: ${response.status} ${response.statusText}`);
                    }
                    return response.json();
                })
                .then(data => {
                    isLoading = false;

                    // کاربر به limit خورده
                    if (data.locked) {
                        showLockedBanner();
                        return;
                    }

                    if (data.success) {
                        displayResults(data);
                    } else {
                        showErrorBanner(data.error || 'Unknown error from server.');
                    }
                })
                .catch(error => {
                    isLoading = false;
                    // Network error, JSON parse error, HTTP error
                    showErrorBanner(error.message || 'Connection failed. Please check your internet and try again.');
                });
        }

        // ── Display Results ──────────────────────────────────────────
        function displayResults(data) {
            const projectsList = document.getElementById('projectsList');
            const resultsCount = document.getElementById('resultsCount');

            resultsCount.textContent = `${data.filtered_count} of ${data.total_active} projects`;

            if (!data.projects || data.projects.length === 0) {
                projectsList.innerHTML = `
                    <div class="no-results">
                        <h3>🔍 No Results Found</h3>
                        <p>Try adjusting your filters or search again.</p>
                    </div>`;
                return;
            }

            let html = '';
            data.projects.forEach(project => {
                const budget      = project.budget ? `$${project.budget}` : 'Not specified';
                const date        = project.published_at
                    ? new Date(project.published_at).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })
                    : 'Unknown';
                const description = project.description
                    ? escapeHtml(project.description).substring(0, 200) + '...'
                    : 'No description available';

                html += `
                    <div class="project-card">
                        <div class="project-title">${escapeHtml(project.title || 'Untitled')}</div>
                        <div class="project-meta">
                            <span>💰 ${budget}</span>
                            <span>📂 ${escapeHtml(project.category || 'Other')}</span>
                            <span>🌐 ${escapeHtml(project.source || '')}</span>
                            <span>📅 ${date}</span>
                        </div>
                        <div class="project-description">${description}</div>
                        <div class="project-actions">
                            <a href="${escapeHtml(project.project_url || '#')}" target="_blank" rel="noopener" class="btn-view">View Project</a>
                            <button class="btn-proposal" onclick="generateProposal(${parseInt(project.id)}, '${escapeHtml(project.title || '').replace(/'/g, "\\'")}')">Generate Proposal</button>
                        </div>
                    </div>`;
            });

            document.getElementById('projectsList').innerHTML = html;
        }

        // ── Locked Banner ────────────────────────────────────────────
        function showLockedBanner() {
            document.getElementById('resultsCount').textContent = '0 projects';
            document.getElementById('projectsList').innerHTML = `
                <div class="locked-banner">
                    <div class="lock-icon">🔒</div>
                    <h3>Daily Limit Reached</h3>
                    <p>You've used your 5 free searches for today.<br>
                       Upgrade to <strong>Premium</strong> for unlimited access to all projects.</p>
                    <a href="/clientradar/ui/locked.php" class="btn-upgrade">⭐ Upgrade to Premium</a>
                </div>`;
        }

        // ── Error Banner ─────────────────────────────────────────────
        function showErrorBanner(message) {
            document.getElementById('resultsCount').textContent = '—';
            document.getElementById('projectsList').innerHTML = `
                <div class="error-banner">
                    <h3>⚠️ Something went wrong</h3>
                    <p>${escapeHtml(message)}</p>
                    <button class="btn-retry" onclick="applyFilters()">🔄 Try Again</button>
                </div>`;
        }

        // ── Save as Default ──────────────────────────────────────────
        function saveAsDefault() {
            const filters = {
                mode:       currentMode,
                categories: Array.from(document.querySelectorAll('input[name="category"]:checked')).map(cb => cb.value),
                budget:     document.querySelector('input[name="budget"]:checked').value,
                recency:    document.querySelector('input[name="recency"]:checked').value,
                sources:    Array.from(document.querySelectorAll('input[name="source"]:checked')).map(cb => cb.value),
                keywords:   document.getElementById('keywords').value
            };
            localStorage.setItem('radarSearchDefaults', JSON.stringify(filters));
            alert('✅ Settings saved successfully!');
        }

        // ── Reset Filters ────────────────────────────────────────────
        function resetFilters() {
            document.querySelectorAll('input[name="category"]').forEach(cb => cb.checked = false);
            document.querySelector('input[name="budget"][value="all"]').checked  = true;
            document.querySelector('input[name="recency"][value="week"]').checked = true;
            document.querySelectorAll('input[name="source"]').forEach(cb => cb.checked = true);
            document.getElementById('keywords').value = '';
            applyFilters();
        }

        // ── Load Defaults on Page Load ───────────────────────────────
        window.addEventListener('DOMContentLoaded', function() {
            try {
                const saved = localStorage.getItem('radarSearchDefaults');
                if (!saved) return;
                const filters = JSON.parse(saved);

                if (filters.categories) {
                    filters.categories.forEach(cat => {
                        const el = document.querySelector(`input[name="category"][value="${CSS.escape(cat)}"]`);
                        if (el) el.checked = true;
                    });
                }
                if (filters.budget) {
                    const el = document.querySelector(`input[name="budget"][value="${CSS.escape(filters.budget)}"]`);
                    if (el) el.checked = true;
                }
                if (filters.recency) {
                    const el = document.querySelector(`input[name="recency"][value="${CSS.escape(filters.recency)}"]`);
                    if (el) el.checked = true;
                }
                if (filters.sources) {
                    document.querySelectorAll('input[name="source"]').forEach(cb => cb.checked = false);
                    filters.sources.forEach(src => {
                        const el = document.querySelector(`input[name="source"][value="${CSS.escape(src)}"]`);
                        if (el) el.checked = true;
                    });
                }
                if (filters.keywords) {
                    document.getElementById('keywords').value = filters.keywords;
                }
            } catch (e) {
                // Corrupted localStorage – just ignore
                localStorage.removeItem('radarSearchDefaults');
            }
        });

        // ── Generate Proposal ────────────────────────────────────────
        function generateProposal(projectId, projectTitle, regenerate = false) {
            const modal     = document.getElementById('proposalModal');
            const modalBody = document.getElementById('modalBody');

            modal.classList.add('active');
            modalBody.innerHTML = `
                <div class="loading">
                    <div class="spinner"></div>
                    <p>AI is crafting your proposal...</p>
                </div>`;

            const url = '../ai/generate_test.php?project_id=' + encodeURIComponent(projectId)
                      + (regenerate ? '&regenerate=1' : '');

            fetch(url)
                .then(response => {
                    if (!response.ok) throw new Error(`Server error: ${response.status}`);
                    return response.json();
                })
                .then(data => {
                    if (data.success) {
                        modalBody.innerHTML = `
                            <h3 style="margin-bottom:15px;">For: ${escapeHtml(projectTitle)}</h3>
                            <div class="proposal-text">${escapeHtml(data.proposal)}</div>
                            <div style="display:flex;gap:10px;">
                                <button class="copy-btn-modal" onclick="copyProposal(this)">📋 Copy to Clipboard</button>
                                <button class="regenerate-btn-modal" onclick="generateProposal(${parseInt(projectId)}, '${escapeHtml(projectTitle).replace(/'/g,"\\'")}', true)">🔄 Regenerate</button>
                            </div>`;
                    } else {
                        modalBody.innerHTML = `
                            <div class="modal-error-message"><strong>Error:</strong> ${escapeHtml(data.error || 'Unknown error')}</div>
                            <button class="copy-btn-modal" onclick="closeModal()">Close</button>`;
                    }
                })
                .catch(error => {
                    modalBody.innerHTML = `
                        <div class="modal-error-message"><strong>Error:</strong> ${escapeHtml(error.message || 'Failed to generate proposal.')}</div>
                        <button class="copy-btn-modal" onclick="closeModal()">Close</button>`;
                });
        }

        function closeModal() {
            document.getElementById('proposalModal').classList.remove('active');
        }

        function copyProposal(button) {
            const text = document.querySelector('.proposal-text').textContent;
            navigator.clipboard.writeText(text).then(() => {
                button.textContent = '✓ Copied!';
                button.classList.add('copied');
                setTimeout(() => {
                    button.textContent = '📋 Copy to Clipboard';
                    button.classList.remove('copied');
                }, 2000);
            }).catch(() => {
                alert('Could not copy. Please select and copy manually.');
            });
        }

        function escapeHtml(text) {
            if (!text) return '';
            const div = document.createElement('div');
            div.textContent = String(text);
            return div.innerHTML;
        }

        // Close modal on backdrop click
        document.getElementById('proposalModal').addEventListener('click', function(e) {
            if (e.target === this) closeModal();
        });

        // Close modal on Escape key
        document.addEventListener('keydown', function(e) {
            if (e.key === 'Escape') closeModal();
        });
    </script>
</body>
</html>